import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import qs from 'qs' // 字符串处理
import merge from 'lodash/merge' // 合并对象工具

// 创建一个axios实例
const service = axios.create({
  // 开发模式请求
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 10000 // 设置请求超时的时间
})

// 请求 拦截器
service.interceptors.request.use(
  config => {
    // 在请求发送之前做些什么
    // 在发送之前把token存储到请求头当中 后端需要获取进行判断鉴权性
    if (store.getters.token) {
      // 发送请求带入token 与后台人员商量好使用标识符严格一致
      config.headers['token'] = getToken()
    }
    return config
  },
  error => {
    // 请求错误怎么办
    // console.log('请求出现错误---' + error)
    // console.log(error) // 为调式
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  // 进行获取到响应数据
  response => {
    // response.data里面的数据 才是 后端返回的数据
    const res = response.data
    // console.log(res)
    // 进行判断响应结果
    if (res.code === 401) {
      // 身份过期
      MessageBox.confirm('用户登陆身份已过期，请重新登陆', '系统提示', {
        confirmButtonText: '重新登陆',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // 跳到登陆页面重新登陆
        store.dispatch('user/logout').then(() => {
          location.reload()
        })
      })
    } else if (res.code === 500) {
      Message({
        message: res.msg !== undefined && res.msg !== '' && res.msg !== null ? res.msg : '服务器内部出现异常，请联系管理员',
        type: 'error',
        duration: 5 * 1000
      })
      // Notification.error({
      //   title: res.msg !== undefined && res.msg !== '' && res.msg !== null ? res.msg : '服务器内部出现异常，请联系管理员'
      // })
      return Promise.reject('error')// 记录错
    } else if (res.code === 201) {
      Notification.error({
        title: res.msg !== undefined && res.msg !== '' && res.msg !== null ? res.msg : '服务器内部出现异常，请联系管理员'
      })
      return Promise.reject('error')// 记录错
    } else if (res.code === 400) { // 参数错误
      Message({
        message: res.msg,
        type: 'error',
        duration: 5 * 1000
      })
      return Promise.reject('error')// 记录错
    } else if (res.code !== 200) {
      Message({
        message: res.msg !== undefined && res.msg !== '' && res.msg !== null ? res.msg : '连接超时、服务错误',
        type: 'error',
        duration: 5 * 1000
      })
    } else {
      // 以上验证通过之后再放行
      return res
    }
  },
  error => {
    // console.log(error)
    Message({
      message: '服务器内部错误,正在火速解决',
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

/**
 * 请求地址处理
 * @param {*} actionName action方法名称
 */
service.adornUrl = (actionName) => {
  // 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!
  //  + window.SITE_CONFIG.baseUrl
  // window.SITE_CONFIG.baseUrl +
  // console.log('请求地址:' + actionName)
  return actionName
}

/**
 * get 请求参数处理
 * @param params
 * @param openDefaultParams
 * @returns {*}
 */
service.adornParams = (params = {}, openDefaultParams = true) => {
  var defaluts = {
  }
  return openDefaultParams ? merge(defaluts, params) : params
}
/**
 * post请求参数处理
 * @param data
 * @param openDefaultdata
 * @param contentType
 * @returns {string}
 */
service.adornData = (data = {}, openDefaultdata = true, contentType = 'json') => {
  var defaults = {
    // 't': new Date().getTime()
  }
  data = openDefaultdata ? merge(defaults, data) : data
  return contentType === 'json' ? JSON.stringify(data) : qs.stringify(data)
}

export default service
